package com.hoki.zj.hrm.service.impl;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.hoki.zj.hrm.asserts.GlobalAssert;
import com.hoki.zj.hrm.client.CourseESClient;
import com.hoki.zj.hrm.doc.CourseDoc;
import com.hoki.zj.hrm.domain.Course;
import com.hoki.zj.hrm.domain.CourseDetail;
import com.hoki.zj.hrm.domain.CourseMarket;
import com.hoki.zj.hrm.domain.LoginUser;
import com.hoki.zj.hrm.dto.CourseDTO;
import com.hoki.zj.hrm.dto.EmailDto;
import com.hoki.zj.hrm.dto.SMSDto;
import com.hoki.zj.hrm.dto.SMsgDto;
import com.hoki.zj.hrm.mapper.CourseDetailMapper;
import com.hoki.zj.hrm.mapper.CourseMapper;
import com.hoki.zj.hrm.mapper.CourseMarketMapper;
import com.hoki.zj.hrm.mapper.CourseTypeMapper;
import com.hoki.zj.hrm.service.ICourseService;
import com.hoki.zj.hrm.utils.AjaxResult;
import com.hoki.zj.hrm.utils.LoginUserContext;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;

import static com.hoki.zj.hrm.constant.MQMessageConst.EXCHANGE_NAME_MQ;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author shukei
 * @since 2021-09-14
 */
@Service
public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course> implements ICourseService {

    /** 注入ICourseDetail */
    @Autowired
    private CourseDetailMapper courseDetailMapper;

    /** 注入CourseMarketMapper */
    @Autowired
    private CourseMarketMapper courseMarketMapper;
    /** 注入CourseTypeMapper */
    @Autowired
    private CourseTypeMapper courseTypeMapper;

    /**
     * 注入RabbitTemplate核心对象
     */
    @Autowired
    private RabbitTemplate rabbitTemplate;


    /** 注入courseESClient */
    @Autowired
    private CourseESClient courseESClient;

    /** 上线 */
    private static final Integer OFFLINE = 0;
    /** 下线 */
    private static final Integer ONLINE = 1;
    /** 免费 */
    private static final Integer FREE = 1;
    /** 付费 */
    private static final Integer PAID = 2;

    /**
     * 后台管理系统保存课程
     * @param dto 保存的数据 Course CourseDetail CourseMarket
     */
    @Override
    @Transactional
    public void save(CourseDTO dto) {
        Course course = dto.getCourse();
        CourseDetail courseDetail = dto.getCourseDetail();
        CourseMarket courseMarket = dto.getCourseMarket();
        GlobalAssert.isNull(course, "课程不能为空");
        // 1.非空判断
        GlobalAssert.hasText(course.getName(), "请填写课程名!!!");
        // 2.添加课程(返回课程id)
        course.setStatus(OFFLINE); // 设置课程状态为下架
        // 3.设置课程相关
        // 3.1通过登录用户上下文控制器工具,获取认证对象
        LoginUser loginUserFromToken = LoginUserContext.getLoginUser();
        // 3.2设置课程相关信息
        setCourse(course, loginUserFromToken);
        // ============================
        baseMapper.insert(course);
        // 4.添加课程详情
        courseDetail.setId(course.getId());
        courseDetailMapper.insert(courseDetail);
        // 5.添加课程营销相关
        courseMarket.setId(course.getId());
        courseMarketMapper.insert(courseMarket);
        // 6.修改对应课程类型的课程数量
        courseTypeMapper.changeTotalCountByCourseTypeIdOfCourse(course.getCourseTypeId());
    }

    // 设置课程相关
    private void setCourse(Course course, LoginUser loginUserFromToken) {
        course.setTenantName(loginUserFromToken.getCompanyName());
        course.setTenantId(loginUserFromToken.getTenantId());
        course.setUserId(loginUserFromToken.getId());
        course.setUserName(loginUserFromToken.getUsername());
    }

    /**
     * 上线
     * @param id コースid
     */
    @Override
    @Transactional
    public void online(Long id) {
        // 1.判断id非空
        GlobalAssert.isNull(id, "课程id不能为空!");
        // 2.查询课程
        Course course = baseMapper.selectById(id);
        // 3.判断课程非空
        GlobalAssert.isNull(course, "课程不存在!");
        // 4.判断课程状态
        GlobalAssert.isEquals(course.getStatus(), OFFLINE, "课程已上线!");
        // 5.修改课程状态,保存到数据库
        course.setStatus(ONLINE);
        baseMapper.updateById(course);
        // 6.调用CourseESClient,保存到ES
        CourseMarket courseMarket = courseMarketMapper.selectById(course); // 查询课程营销信息
        CourseDoc courseDoc = toCourseDoc(course, courseMarket); // 转换为CourseDoc
        // 7.判断保存是否成功
        AjaxResult result = courseESClient.save(courseDoc);
        GlobalAssert.isSuccess(result.isSuccess(), result.getMessage());
        // 8.发送消息到mq
        // 手机短信
//        SMSDto smsDto = new SMSDto();
        // 邮件
//        EmailDto emailDto = new EmailDto();
        // 站内信
//        SMsgDto sMsgDto = new SMsgDto();
//        sendCourseOnlineNotification(smsDto, emailDto, sMsgDto);
    }

    /**
     * CourseDocへ変換
     * @param course コース
     * @param courseMarket コース価格
     * @return CourseDoc courseDoc
     */
    private CourseDoc toCourseDoc(Course course, CourseMarket courseMarket) {
        CourseDoc courseDoc = new CourseDoc();
        BeanUtils.copyProperties(course, courseDoc); // 将Course中需要查询的字段赋值给CourseDoc
        courseDoc.setPublishTime(new Date()); // 设置发布时间
        courseDoc.setCharge(courseMarket.getCharge() == FREE ? "免费" : "收费"); // 设置是否收费
        courseDoc.setPrice(courseMarket.getPrice()); // 设置售价
        courseDoc.setPriceOld(courseMarket.getPriceOld()); // 设置原价
        return courseDoc;
    }

    /**
     * コースリリースの通知発送
     * @param smsDto smsDto
     * @param emailDto emailDto
     * @param sMsgDto sMsgDto
     */
    public void sendCourseOnlineNotification(SMSDto smsDto, EmailDto emailDto, SMsgDto sMsgDto) {
        // 手机短信
        smsDto.setContent("新的课程上线了!,点击有惊喜www.twitter.com");
        smsDto.setPhoneNum("13487946512");
        rabbitTemplate.convertAndSend(EXCHANGE_NAME_MQ,  // 指定发送的交换机
                "course.sms",  // 指定路由
                smsDto); // 指定发送的数据

        // 邮件
        emailDto.setContent("新的课程上线了!,点击有惊喜www.twitter.com");
        emailDto.setEmailAddress("158496478@qq.com");
        emailDto.setTitle("新课程上线了!");
        rabbitTemplate.convertAndSend(EXCHANGE_NAME_MQ,  // 指定发送的交换机
                "course.email",  // 指定路由
                emailDto); // 指定发送的数据

        // 站内信
        sMsgDto.setTitle("新课程上线了!");
        sMsgDto.setContent("新的课程上线了!,点击有惊喜www.twitter.com");
        sMsgDto.setUserId(1L);
        rabbitTemplate.convertAndSend(EXCHANGE_NAME_MQ,  // 指定发送的交换机
                "course.smsg",  // 指定路由
                sMsgDto); // 指定发送的数据
    }

    /**
     * 下线
     * @param id コースid
     */
    @Override
    @Transactional
    public void offLine(Long id) {
        // 1.判断id非空
        GlobalAssert.isNull(id, "课程id不能为空!");
        // 2.查询课程
        Course course = baseMapper.selectById(id);
        // 3.判断课程非空
        GlobalAssert.isNull(course, "课程不存在!");
        // 4.判断课程状态
        GlobalAssert.isEquals(course.getStatus(), ONLINE, "课程已下线");
        // 5.修改课程状态,保存到数据库
        course.setStatus(OFFLINE);
        baseMapper.updateById(course);
        // 6.调用CourseESClient,删除ES中对应的数据
        AjaxResult delResult = courseESClient.del(id);
        GlobalAssert.isSuccess(delResult.isSuccess(), "保存失败");
    }
}
